.equ PERSON_SIZE,76
.equ SYS_READ,0
.equ STDIN,0
.section .data
	str1:
		.string "要删除的联系人不存在\n"
	str2:
		.string "请输入要删除的联系人的名字\n"
	str3:
		.string "请输入要删除的联系人的名字>"
	str4:
		.string "%s"
	str5:
		.string "删除联系人成功\n"
	str6:
		.string "通讯录为空\n"
.section .bss
    .lcomm fp,8
.section .text
.global DelContact
.type DelContact,@function
DelContact:
	nop
	push %rbp
	mov %rsp,%rbp
	sub $24,%rsp
	mov %rdi,-8(%rbp) #结构体地址
	mov -8(%rbp),%rbx
	cmpl $0,12(%rbx)
	je 3f
#获取用户输入联系人名字
	mov $0,%rax
	mov $str3,%rdi
	call printf
	#mov $SYS_READ,%rax
	#mov $STDIN,%rdi
	#mov $20,%rdx
	mov $20,%rdi
	call malloc
	movq %rax,fp
	movq fp,%r12
	mov %r12,%rsi
	mov $str4,%rdi
	#leaq -28(%rbp),%rsi
	call scanf
	#syscall 用read会有\n导致匹配不到
#删除前首先得根据名字查找联系人的位置
	movq -8(%rbp),%rdi
	movq %r12,%rsi
	call FindByName
	cmpq $-1,%rax
	je 2f
#找到联系人,把后面的往前移动一个结构体大小,同时将大小减掉1
#for (int i = ret; i < c->sz - 1; i++)  c->data[i] = c->data[i + 1]
	movl %eax,-12(%rbp) #i=ret FindByName返回的结果
	jmp 1f
#比较i+1和sz的大小
0:
	mov -8(%rbp),%rbx
	mov -12(%rbp),%ecx
	imull $PERSON_SIZE,%ecx #获取堆内存偏移量
	movq (%rbx),%rax  #获取堆内存首地址
	leaq 0(%rax,%rcx),%r11 #获取第i个偏移量的堆地址
	movq $PERSON_SIZE,%r12
	addq %r11,%r12  #获取第i+1个偏移量的堆地址
#调用字节传送指令将第i+1偏移量处数据移动到i偏移量处	
	mov $PERSON_SIZE,%rcx
	cld
	mov %r12,%rsi
	mov %r11,%rdi	
 	rep movsb
#i++
	incl -12(%rbp)			
1:
	movl -12(%rbp),%r10d
    addl $1,%r10d
    cmpl 12(%rbx),%r10d
	jb 0b
    decl 12(%rbx) #sz--
	mov $0,%rax
	mov $str5,%rdi
	call printf
	mov fp,%rdi
	call free
	leaveq 
	retq
#没找到联系人
2:
	mov fp,%rdi
	call free
	mov $0,%rax
	mov $str1,%rdi
	call printf
	leaveq 
	retq
3:
	mov $0,%rax
	mov $str6,%rdi
	call printf 
	leaveq
	retq
